perm filename TOWER[L70,TES] blob sn#009935 filedate 1972-05-22 generic text, type T, neo UTF8
00100	                   %  TWO  VERSIONS   OF   "TOWER"   ARE   PRESENTED.
00200	                   "TWOTOWERS" IS THE SAME IN BOTH VERSIONS %
00300	
00400	EXPR TWOTOWERS(H1, H2) ;
00500		LIST(TOWER(H1), TOWER(H2)) ;
00600	
00700	% * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
00800	VERSION 1 --
00900	                   THE ARGUMENT OF "CHOICE" IS THE NUMBER  OF  BLOCKS
01000	                   THAT REMAIN %
01100	
01200	EXPR TOWER(HEIGHT) ;
01300		IF HEIGHT = 0 THEN NIL
01400		ELSE IF HEIGHT LESSP 0 THEN FAILURE()
01500		ELSE	BEGIN
01600			NEW WHICH, WHAT ;
01700			WHICH ← CHOICE(LENGTH(BLOCKS)) ;
01800			WHAT ← NTH(WHICH, BLOCKS) ;
01900			BLOCKS ← REMOVE(WHICH, BLOCKS) ;
02000			RETURN (WHAT CONS TOWER(HEIGHT-WHAT)) ;
02100			END ;
02200	
02300	EXPR NTH(N,L) ; IF N=1 THEN CAR L ELSE NTH(N-1, CDR L) ;
02400	
02500	EXPR REMOVE(N, L) ; IF N=1 THEN CDR L ELSE CAR L CONS REMOVE(N-1, CDR L) ;
02600	
02700	
02800	% * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
02900	VERSION 2 --
03000	                   THE  ARGUMENT  OF  "CHOICE" IS ALWAYS 2 -- CAR VS.
03100	                   CDR.  THIS VERSION IS  MUCH  MORE  EFFICIENT  THEN
03200			    VERSION 1.              %
03300	
03400	EXPR TOWER(HEIGHT) ;
03500		BEGIN
03600		NEW PILE ;
03700		PILE ← BLOCKS ; BLOCKS ← NIL ;
03800		RETURN TOWER1(HEIGHT, PILE) ;
03900		END ;
04000	
04100	                   % THE TOWER IS BUILT FROM "PILE" AND UNUSED BLOCKS
04200	                   ARE RETURNED TO "BLOCKS".   IF  CHOICE(2)=1,  THEN
04300	                   CAR(PILE)  IS  PUT  ON  THE TOWER; IF CHOICE(2)=2,
04400	                   THEN CAR(PILE) IS RETURNED TO "BLOCKS". %
04500	
04600	EXPR TOWER1(HEIGHT, PILE) ;
04700		IF HEIGHT=0 THEN PROG2( BLOCKS ← APPEND(PILE,BLOCKS) , NIL )
04800		ELSE IF HEIGHT LESSP 0 OR NULL(PILE) THEN FAILURE()
04900		ELSE IF CHOICE(2)=1 THEN
05000			CAR(PILE) CONS TOWER1(HEIGHT-CAR(PILE), CDR(PILE))
05100		ELSE PROG2(	BLOCKS ← CAR(PILE) CONS BLOCKS,
05200				TOWER1(HEIGHT, CDR(PILE))	) ;